package com.example.month11.navigation.navigationbar;

import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * NavigationBar 头部的Builder基类。
 * AbsNavigationBar, Builder, 参数Params.
 */
public abstract class AbsNavigationBar<P extends AbsNavigationBar.Builder.AbsNavigationParams>
        implements INavigationBar {
    // 传进来的参数
    private P mParams;
    private View mNavigationView;

    public AbsNavigationBar(P params) {
        this.mParams = params;
        createAndBindView();
    }

    public P getParams() {
        return mParams;
    }

    protected void setText(int viewId, String text) {
        TextView tv = mNavigationView.findViewById(viewId);
        if (!TextUtils.isEmpty(text)) {
            tv.setVisibility(View.VISIBLE);
            tv.setText(text);
        }
    }

    protected void setOnClickListener(int viewId, View.OnClickListener clickListener) {
        mNavigationView.findViewById(viewId).setOnClickListener(clickListener);
    }
//    public <T extends View> T findViewById(int viewId) {
//        return (T) mNavigationView.findViewById(viewId);
//    }

    /**
     * 根据传进来的参数集合P，创建和绑定View
     */
    private void createAndBindView() {
        // 未给Activity设置id（android:id="@+id/view_group"）
        if (mParams.mParent == null) {
            // 获取Activity的根布局（是否是LinearLayout）。继承自AppCompatActivity。
            ViewGroup activityRoot = ((Activity) mParams.mContext).findViewById(android.R.id.content);
            mParams.mParent = (ViewGroup) activityRoot.getChildAt(0);
            Log.d("TAG", "" + mParams.mParent); // LinearLayout
        }
        // TODO 处理继承自Activity，的View源码部分。
        // ...

        if (mParams.mParent == null) return;
        // 1.创建View，bindLayoutId()调用子类实现的方法(抽象方法)，获取到布局id。
        mNavigationView = LayoutInflater.from(mParams.mContext)
                .inflate(bindLayoutId(), mParams.mParent, false);
        // 2. 头部navigationView，添加到第0个位置(根布局LinearLayout的第一个元素)
        mParams.mParent.addView(mNavigationView, 0);
        // 3. 绑定参数
        applyView();
    }


    // 内部抽象类。静态类里面还有静态类。
    public abstract static class Builder {
        public Builder(Context context, ViewGroup parent) {
        }
        public abstract AbsNavigationBar builder();
        public static class AbsNavigationParams {
            public Context mContext;
            public ViewGroup mParent;

            public AbsNavigationParams(Context context, ViewGroup parent) {
                this.mContext = context;
                this.mParent = parent;
            }
        }
    }
}
